﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using KPIS.GERP.SERVICE.DAL;
using KPIS.GERP.SERVICE.Model;

namespace KPIS.GERP.SERVICE.WorkflowService.Class
{
    public static class ApproveDataLoader
    {
        public static List<int> LoadNextStep(ref approval_task approvalTask, string messageTitle, string messageReasons, out bool isHeIsTop)
        {
            isHeIsTop = false;
            approvalTask.Walk();

            if (approvalTask.CurrentStep > approvalTask.CountAllStep)
            {
                if (!approvalTask.Completed)
                    approvalTask.Status = TaskStatus.Finished;

                return new List<int>();
            }

            approvalTask.AddHistoryHead(string.Format("เข้าสู่การขออนุมัติขั้นตอนที่ {0} จาก {1}",
                                                      approvalTask.CurrentStep, approvalTask.CountAllStep), "", true);

            try
            {
                var ruleApproveSeq = approvalTask.CurrentRuleApprove.rule_approve_seq;
                var lastActionBy = approvalTask.LastActionData.By.pos_seq.Value;

                approvalTask.CurrentRuleApprove.Approvers = RuleApproveDb.GetApprovers(ruleApproveSeq, lastActionBy,
                                                                                       out isHeIsTop);

                // หากเขาเป็นตำแหน่งสูงสุด, และ CurrentRule เป็น 2 และ มี Rule ต่อจากนี้ที่ยังเป็น 2 ต่อไปอีกตั้งแต่ 1 Rule
                if (isHeIsTop && approvalTask.IsApproverTypeUpperPosition && approvalTask.GetRuleApproveType1AfterCurrent.Count > 0)
                {
                    List<hrm_ps_employees> approvers = new List<hrm_ps_employees>();
                    string actionUnion = string.Empty;
                    if (approvalTask.NextRuleApprove != null)
                    {
                        approvers = approvalTask.NextRuleApprove.Approvers;
                        // Action string ที่เขาทำได้ทั้งหมดใน Rule ปัจจุบัน
                        actionUnion = approvalTask.NextRuleApprove.action;
                    }
                    List<string> actionUnionArray = actionUnion.Split(',').ToList();

                    // รวมเข้ากับ Actionstring ของ rule ที่เป็น 2 ที่มาตามหลัง Rule ปัจจุบันจนถึง Rule ที่ไม่เป็น 2 หรือหมด Rule
                    foreach (rule_approve ru in approvalTask.GetRuleApproveType1AfterCurrent)
                    {
                        List<string> actionsInEachRu = ru.action.Split(',').ToList();
                        foreach (var actionInEachRu in actionsInEachRu)
                        {
                            if (!actionUnionArray.Contains(actionInEachRu))
                                actionUnionArray.Add(actionInEachRu);
                        }
                    }

                    // ถ้าการอนุมัติด้วย 2 ยาวไปจนถึงจบ
                    if (approvalTask.GetRuleApproveType1AfterCurrent.Last().step ==
                        approvalTask.RuleApproves.Last().step)
                    {
                        actionUnionArray.Remove("F");
                        actionUnionArray.Remove("N");
                    }

                    // ย้าย Rule Approve ไปตัวท้ายสุดที่เป็น 2
                    approvalTask.CurrentRuleApprove = approvalTask.GetRuleApproveType1AfterCurrent.Last();
                    approvalTask.CurrentStep = approvalTask.GetRuleApproveType1AfterCurrent.Last().step.Value;

                    // Load approver
                    if (approvalTask.NextRuleApprove != null)
                        approvalTask.NextRuleApprove.Approvers = approvers;

                } else if(approvalTask.IsApproverTypeHeadJobSite)
                {
                    var jobSiteSeqOfEmployee = new Employee().GetJobSiteSeqFromEmpSeq(approvalTask.RequestEmpSeq);
                    var employeeHead = new Employee().LoadJobSiteHeadEmployee(jobSiteSeqOfEmployee);
                    if (approvalTask.NextRuleApprove != null)
                        approvalTask.NextRuleApprove.Approvers = new List<hrm_ps_employees> {employeeHead};
                }
            }
            catch (Exception ex)
            {
                ApprovalTaskUtils.EndLoad("มีปัญหาในการโหลดผู้อนุมัติ", ref approvalTask);
            }

            try
            {
                approvalTask.custom_buttons =
                    new RuleApprove().GetRuleApproveCustomButton(
                        approvalTask.CurrentRuleApprove.rule_approve_type.rule_approve_group_seq);
            }
            catch (Exception ex)
            {
                approvalTask.AddHistory("มีปัญหาในการโหลดปุ่มเชื่อมโยงข้อมูล");
            }

            approvalTask.AddHistory(string.Format("จะส่งข้อความไปยังบุคคลที่มีสิทธิ์การอนุมัติทั้งสิ้น {0} คน ดังต่อไปนี้",
                                                  approvalTask.CurrentRuleApprove.Approvers.Count), "", true);

            var messageDAL = new Message();
            int count = 0;

            var result = new List<int>();
            foreach (var approverEmployee in approvalTask.CurrentRuleApprove.Approvers)
            {
                string empString = approverEmployee.full_name;
                try
                {
                    var messageSeq = messageDAL.InsertMessage(approvalTask.Reference.ref_seq.ToString(),
                                                              DateTime.Now,
                                                              approvalTask.CurrentStep == 1 || isHeIsTop ? approvalTask.Title : messageTitle,
                                                              approvalTask.CurrentRuleApprove.remarks,
                                                              approvalTask.RequestEmpSeq.ToString(),
                                                              approverEmployee.emp_seq.ToString(),
                                                              null,
                                                              approvalTask.ApprovalTaskSeq.ToString(),
                                                              approvalTask.CurrentRuleApprove.rule_approve_seq.ToString(),
                                                              "1",
                                                              messageReasons,
                                                              "U",
                                                              approvalTask.RequestEmpSeq.ToString(),
                                                              approvalTask.ActionCount,
                                                              Convert.ToString(approvalTask.ApprovalTaskSeq));

                    approvalTask.AddHistory(string.Format("- ส่งงานขออนุมัติให้ {0} สำเร็จ โดยมีสิทธิ์ <span style=\"color:blue;\">{1}</span>",
                                                          empString,
                                                          ApprovalUtil.ConvertShortActionToWord(approvalTask.CurrentRuleApprove.action)), "", true);
                    count++;
                    result.Add(Convert.ToInt32(messageSeq));
                }
                catch (Exception ex)
                {
                    approvalTask.AddHistory("มีปัญหาในการส่งข้อความไปยัง " + empString);
                }
            }

            approvalTask.AddHistory(string.Format("รออนุมัติ<br/>", count), "", true);

            return result;
        }

        public static int GetRuleApproveSeqOfStep(approval_task approvalTask, int step)
        {
            var ruleApprove = (from r in approvalTask.RuleApproves where r.step == step select r).FirstOrDefault();
            if (ruleApprove != null && ruleApprove.rule_approve_type_seq.HasValue)
                return ruleApprove.rule_approve_type_seq.Value;

            return 0;
        }

        public static List<hrm_ps_employees> GetApproversOfStep(int ruleApproveSeq, int posSeq, out bool isHeIsTop)
        {
            return RuleApproveDb.GetApprovers(ruleApproveSeq, posSeq, out isHeIsTop);
        }

        public static List<int> SendMessage(approval_task approvalTask, string messageTitle,
                                            hrm_ps_employees approverEmployee, string messageReasons)
        {
            var result = new List<int>();
            string empString = string.Format("{1}", approverEmployee.emp_seq,
                                             approverEmployee.full_name);
            var messageDAL = new Message();
            try
            {
                var messageSeq = messageDAL.InsertMessage(approvalTask.Reference.ref_seq.ToString(),
                                                          DateTime.Now,
                                                          approvalTask.CurrentStep == 1 ? approvalTask.Title : messageTitle,
                                                          approvalTask.CurrentRuleApprove != null ? approvalTask.CurrentRuleApprove.remarks : "",
                                                          approvalTask.RequestEmpSeq.ToString(),
                                                          approverEmployee.emp_seq.ToString(),
                                                          null,
                                                          approvalTask.ApprovalTaskSeq.ToString(),
                                                          approvalTask.CurrentRuleApprove != null ? approvalTask.CurrentRuleApprove.rule_approve_seq.ToString() : null,
                                                          "1",
                                                          messageReasons,
                                                          "U",
                                                          approvalTask.RequestEmpSeq.ToString(),
                                                          approvalTask.ActionCount,
                                                          Convert.ToString(approvalTask.ApprovalTaskSeq));
                if (!string.IsNullOrWhiteSpace(approvalTask.CurrentRuleApprove != null ? approvalTask.CurrentRuleApprove.action : ""))
                    approvalTask.AddHistory(string.Format("- ส่งงานขออนุมัติให้ {0} สำเร็จ โดยมีสิทธิ์ <span style=\"color:blue;\">{1}</span>",
                                                          empString,
                                                          ApprovalUtil.ConvertShortActionToWord(approvalTask.CurrentRuleApprove != null
                                                                                                    ? approvalTask.CurrentRuleApprove.action
                                                                                                    : "")), "", true);
                result.Add(Convert.ToInt32(messageSeq));
            }
            catch (Exception ex)
            {
                approvalTask.AddHistory("มีปัญหาในการส่งข้อความไปยัง " + empString);
            }
            return result;
        }
    }
}